// memoryDemo
// Created by Administrator on 2025/6/27.
// unique_ptr 智能指针

#include <iostream>
#include <memory>
using namespace std;


class MyClass {
    int id;
    string name;

public:
    MyClass() {
        cout << "MyClass created." << endl;
    }

    ~MyClass() {
        cout << "MyClass destroyed." << endl;
    }

    void print() const {
        cout << "hello c++." << endl;
    }
};

/**
 * 常规指针
 */
void normaPtrFunc() {
    const MyClass *myPtr1 = new MyClass();
    myPtr1->print();
    delete myPtr1; // 需要手动释放资源
}

/**
 * 独占-智能指针
 *
 * 同一时间只能有一个 unique_ptr 指向特定内存的指针
 */
void uniquePtrFunc() {
    const unique_ptr<MyClass> myPtr2(new MyClass());
    // const unique_ptr<MyClass> myPtr3 = myPtr2; // 无法指向同一块内存
    myPtr2->print();
    // 程序执行结束，自动释放资源。无需手动 delete myPtr2
}

/**
 * 共享-智能指针
 *
 * 可以有多个 shared_ptr 指向同一个内存的指针，只有当所有指针都被销毁时，才会释放资源
 */
void sharedPtrFunc() {
    const shared_ptr<MyClass> myPtr3(new MyClass());
    const shared_ptr<MyClass> myPtr4 = myPtr3;

    myPtr3->print();
    myPtr4->print();

    // 只有当 myPtr3 和 myPtr4 都被销毁时，才会释放资源
}


/**
 * allocator 内存分配管理组件
 */
void allocatorFunc() {
    allocator<int> alloc;
    // 分配足够存储一个 int 的内存给 p
    int *p = alloc.allocate(1);
    // 构造一个值为 45 的 int 对象，并将其存储在 p 中
    alloc.construct(p, 45);
    cout << "p values :\t" << *p << endl;
    // 销毁 p 对象，但不释放内存
    alloc.destroy(p);
    // 释放 p 所分配的内存
    alloc.deallocate(p, 1);
}

int main(int argc, char *argv[]) {
    // cout << "常规指针" << endl;
    // normaPtrFunc();
    // cout << "\n\n智能指针" << endl;
    // uniquePtrFunc();

    cout << "allocator 测试" << endl;
    allocatorFunc();
    return 0;
}
